#ifndef CONSTANTS_H
#define CONSTANTS_H

class Perspective;
class Constants;

typedef enum {
    SKY_TIMED,
    SKY_RANDOM
} SkyChoice;

// if number of body types above changes then this must be changed accordingly
#define BODY_TYPE_COUNT (5)

#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
    #define REPLAYS_DIRECTORY "resources\\replays\\"
#else
    #define REPLAYS_DIRECTORY "./resources/replays/"
#endif

#define CLONED_ALPHA_FACTOR (0.5f)

class Constants
{
public:
    // locations of resources and config files
    static Ogre::String RESOURCES_FOLDER;
    static Ogre::String CONFIG_FILE;
    static Ogre::String POD_CONFIG_FILE;
    static Ogre::String AUDIO_FOLDER;
    
    // strength of gravity
    static float GRAVITY_STRENGTH; // (units per second squared)
    
    // default density of physics bodies (mass per unit cubed)
    static float DEFAULT_DENSITY;
    
    // max angle that world can be rotated by based on the normal gravity
    static Ogre::Radian MAX_ANGLE;
    
    // rate at which camera will yaw round to follow ball
    static Ogre::Radian TRACKING_SPEED_CHANGE; // (radians per second)
    static float TRACKING_TIME; // (seconds)
    
    // time taken for the ball to teleport
    static float TELEPORT_DURATION;
    
    // zoom factor as ball size changes
    static float ZOOM_FACTOR;
    
    // maximum amount of time to wait until we move camera if we can't see the ball
    static float MAX_TIME_BALL_NOT_SEEN;
    
    //moving platform values
    static float MOV_ACC;
    static float MOV_DECEL_DIST;
    static float MOV_ROTATE_SPEED; //radians per sec
    static float MOV_MAX_ROTATE_DIST;

    // max speed of ball to complete level when touching end zone
    static float END_ZONE_MAX_SPEED; // (metres per second)
    
    // choose how the skies are chosen
    static SkyChoice skyChoice;
    
    // desired frame rate of physics engine
    static int OGRE_NEWT_FRAMERATE;
    
    // input device constants
    static int SPEED_FACTOR;
    static int SENSITIVITY_FACTOR;
} ;

#endif
